package com.ror.java.se.string;

/**
 * 字符串常量与字符串变量的拼接：
 * - 字符串常量拼接的原理是编译期优化。"a"+"b"
 * - 字符串变量拼接的原理是StringBuilder。s1+s2
 */

public class Demo01Concat {
    public static void main(String[] args) {
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab"; // StringTable串池
        String s4 = s1 + s2; // Heap堆，new StringBuilder().append("a").append("b").toString()
        String s5 = "a" + "b"; // 串池，编译优化+串池有复用机制，与s3同引用
        String s6 = new String(new char[] { 'a', 'b' }); // 堆，全新的对象
        System.out.println(s3 == s4); // false，s3在串池中，s4在堆中串池外
        System.out.println(s3 == s5); // true，串池，有复用机制，与s3同引用
        System.out.println(s4 == s5); // false，s4在堆中串池外，s5在串池中
        System.out.println(s4 == s6); // false，堆中的两个相同内容的对象
    }
}